#ifndef MCU_PORT_H_
#define MCU_PORT_H_
#include "includes.h"

#ifdef MCU_STM32F103RCT6
#ifdef BIGCAR
#define PPM 3856.6
#define WLB 0.165 
#define WLR 0.03 
#define WLC 0.21 
#endif

#ifdef MINICAR
#define PPM 7110
#define WLB 0.131
#define WLR 0.024 
#define WLC 0.1508
#endif
//-----------------------------down to top port------------------------------------------------------------
//pwm
#define PWM_START()  do{HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);}while(0)
#define PWM_STOP()	 do{HAL_TIM_PWM_Stop(&htim2, TIM_CHANNEL_1);HAL_TIM_PWM_Stop(&htim2, TIM_CHANNEL_2);}while(0)
#define PWM_SET(x,y) do{__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_2, x);__HAL_TIM_SetCompare(&htim2, TIM_CHANNEL_1, y);}while(0)

//gpio
#define AIN1_SET() HAL_GPIO_WritePin(AIN1_GPIO_Port,AIN1_Pin,GPIO_PIN_SET)
#define AIN1_CLR() HAL_GPIO_WritePin(AIN1_GPIO_Port,AIN1_Pin,GPIO_PIN_RESET)

#define AIN2_SET() HAL_GPIO_WritePin(AIN2_GPIO_Port,AIN2_Pin,GPIO_PIN_SET)
#define AIN2_CLR() HAL_GPIO_WritePin(AIN2_GPIO_Port,AIN2_Pin,GPIO_PIN_RESET)

#define BIN1_SET() HAL_GPIO_WritePin(BIN1_GPIO_Port,BIN1_Pin,GPIO_PIN_SET)
#define BIN1_CLR() HAL_GPIO_WritePin(BIN1_GPIO_Port,BIN1_Pin,GPIO_PIN_RESET)

#define BIN2_SET() HAL_GPIO_WritePin(BIN2_GPIO_Port,BIN2_Pin,GPIO_PIN_SET)
#define BIN2_CLR() HAL_GPIO_WritePin(BIN2_GPIO_Port,BIN2_Pin,GPIO_PIN_RESET)

#define STBY_SET() HAL_GPIO_WritePin(STBY_GPIO_Port,STBY_Pin,GPIO_PIN_SET)
#define STBY_CLR() HAL_GPIO_WritePin(STBY_GPIO_Port,STBY_Pin,GPIO_PIN_RESET)

//OLED 
#define OLED_SCLK_Clr() HAL_GPIO_WritePin(OLED_SCL_GPIO_Port,OLED_SCL_Pin,GPIO_PIN_RESET)
#define OLED_SCLK_Set() HAL_GPIO_WritePin(OLED_SCL_GPIO_Port,OLED_SCL_Pin,GPIO_PIN_SET)//SCL

#define OLED_SDIN_Clr() HAL_GPIO_WritePin(OLED_SDA_GPIO_Port,OLED_SDA_Pin,GPIO_PIN_RESET)
#define OLED_SDIN_Set() HAL_GPIO_WritePin(OLED_SDA_GPIO_Port,OLED_SDA_Pin,GPIO_PIN_SET)//DIN
//LED
#define SPDLED_SET() HAL_GPIO_WritePin(SPDLED_GPIO_Port,SPDLED_Pin,GPIO_PIN_RESET)
#define SPDLED_CLR() HAL_GPIO_WritePin(SPDLED_GPIO_Port,SPDLED_Pin,GPIO_PIN_SET)

#define POSLED_SET() HAL_GPIO_WritePin(POSLED_GPIO_Port,POSLED_Pin,GPIO_PIN_RESET)
#define POSLED_CLR() HAL_GPIO_WritePin(POSLED_GPIO_Port,POSLED_Pin,GPIO_PIN_SET)

#define TCKLED_SET() HAL_GPIO_WritePin(TCKLED_GPIO_Port,TCKLED_Pin,GPIO_PIN_RESET)
#define TCKLED_CLR() HAL_GPIO_WritePin(TCKLED_GPIO_Port,TCKLED_Pin,GPIO_PIN_SET)
#define TCKLED_STA(x) do{x%=10;if(x>5)TCKLED_SET();else TCKLED_CLR();}while(0)

#define STALED_SET() HAL_GPIO_WritePin(STALED_GPIO_Port,STALED_Pin,GPIO_PIN_RESET)
#define STALED_CLR() HAL_GPIO_WritePin(STALED_GPIO_Port,STALED_Pin,GPIO_PIN_SET)
#define STALED_TGT() HAL_GPIO_TogglePin(STALED_GPIO_Port,STALED_Pin)
#define STALED_STA(x) do{x%=10;if(x>5)STALED_SET();else STALED_CLR();}while(0)

#define UARTLED_SET() HAL_GPIO_WritePin(UARTLED_GPIO_Port,UARTLED_Pin,GPIO_PIN_RESET)
#define UARTLED_CLR() HAL_GPIO_WritePin(UARTLED_GPIO_Port,UARTLED_Pin,GPIO_PIN_SET)
#endif

#ifdef MCU_TIVAC123
#ifdef BIGCAR
#define PPM 3856.6
#define WLB 0.165 
#define WLR 0.03 
#define WLC 0.21 
#endif
#ifdef BIGCARPRO
#define PPM 7130
#define WLB 0.115 
#define WLR 0.0325 
#define WLC 0.2042 
#endif
#ifdef MINICAR
#define PPM 7110
#define WLB 0.131
#define WLR 0.024 
#define WLC 0.1508
#endif

//-----------------------------down to top port------------------------------------------------------------
//pwm
#define PWM_START()  do{PWMGenEnable(PWM0_BASE, PWM_GEN_0);PWMGenEnable(PWM0_BASE, PWM_GEN_1);PWMOutputState(PWM0_BASE, PWM_OUT_0_BIT, true);PWMOutputState(PWM0_BASE, PWM_OUT_1_BIT, true);}while(0)
#define PWM_STOP()	 do{PWM0_output(0);PWM1_output(0);}while(0)
#define PWM_SET(x,y) do{PWM0_output(x);PWM1_output(y);}while(0)

//gpio
#define AIN1_SET() GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_2, 1 << 2)
#define AIN1_CLR() GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_2, 0 << 2)

#define AIN2_SET() GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_3, 1 << 3)
#define AIN2_CLR() GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_3, 0 << 3)

#define BIN1_SET() GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_4, 1 << 4)
#define BIN1_CLR() GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_4, 0 << 4)

#define BIN2_SET() GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_7, 1 << 7)
#define BIN2_CLR() GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_7, 0 << 7)

#define STBY_SET() GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_2, 1 << 2)
#define STBY_CLR() GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_2, 0 << 2)

//OLED 
#define OLED_SCLK_Clr() GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_5, 0<<5)
#define OLED_SCLK_Set() GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_5, 1<<5)//SCL

#define OLED_SDIN_Clr() GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_6, 0<<6)//DIN
#define OLED_SDIN_Set() GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_6, 1<<6)

//LED
#define SPDLED_SET() GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, 1 << 1)
#define SPDLED_CLR() GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, 0 << 1)

#define POSLED_SET() GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 1 << 2)
#define POSLED_CLR() GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0 << 2)

#define TCKLED_SET() GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3, 1 << 3)
#define TCKLED_CLR() GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3, 0 << 3)
#define TCKLED_STA(x) do{x%=10;if(x>5)TCKLED_SET();else TCKLED_CLR();}while(0)

#define STALED_SET() GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, 1 << 1)
#define STALED_CLR() GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1, 0 << 1)
#define STALED_TGT() 
#define STALED_STA(x) do{x%=10;if(x>5)STALED_SET();else STALED_CLR();}while(0)

#define UARTLED_SET()
#define UARTLED_CLR() 
#endif
//encoder
void getMotorVelocity(int* left,int* right);
//Uart
void debugUartSend(uint8_t* data,int len);
void trackUartSend(uint8_t* data,int len);
void ctrlUartSend(uint8_t* data);
//MCUInit
void mcuInit(void);

//-----------------------------top to down port------------------------------------------------------------
extern uint8_t DBG_RxProBuf[100];
extern uint8_t TCK_RxProBuf[100];
extern uint8_t CTL_RxProBuf[100];

void tim10msISR(void);
void tim50msISR(void);
void tim100msISR(void);

void debugUartISR(void);
void trackUartISR(void);
void ctrlUartISR(void);

#ifdef MCU_STM32F103RCT6
void Uart_RxAgain(UART_HandleTypeDef *huart);
#endif

#endif
